【flash基础】简单的 打飞机小游戏 |
您所在的位置:网站首页 › flash 小游戏制作 › 【flash基础】简单的 打飞机小游戏 |
学校还教这东西,也真是迷。比起 普通的游戏库 应该舒服的多。 纯当练手写了一个demon。很简陋,不过 代码量很少应该比较好参考。 网上的资料不是很多,有兴趣的可以拿去参考下。 代码 链接:https://pan.baidu.com/s/1Vx_A37a07qJIkg443N3Jwg 提取码:opi9 --------------------------效果--------------------------- --------------------------需求--------------------------- 先分析一下我们需要什么。 小炮塔 1.可以被wasd控制 【事件绑定】 2.炮塔会跟着鼠标转 【坐标转向量转角度】 3.点击鼠标会发射炮弹 【事件绑定 和 new出来子弹】 敌人 1.被击中的时候会消失 【碰撞检测】 子弹 1会沿着一个方向一直飞 【坐标转单位向量*速度】 2 击中敌人会消失 【碰撞检测】 主循环 最重要的 游戏是运行在一个主循环里面的 我们需要去创造一个主循环。 --------------------------类的介绍--------------------------- 几个类 以下的类都实现了以上的功能 bullet是子弹 enamy是敌人 Gloablinput 用来接收输入的。比如你输入w 的forward就会变成1 鼠标点击 里面一个布尔类型的变量就会变true Mycharacter 是自机。 第3帧 写了个按钮的 不是很重要 显示按钮界面 并且吧游戏暂停在这里。 bt1.addEventListener(MouseEvent.CLICK, bt1Action); bt2.addEventListener(MouseEvent.CLICK, bt2Action); function bt1Action (event:MouseEvent) { gotoAndPlay(4) } function bt2Action(event:MouseEvent):void { var url = "https://www.bilibili.com/" navigateToURL(new URLRequest(url), "_blank"); } stop()游戏主循环部分 gotoAndPlay(11) 表示从第11帧执行,可以看出来游戏 一直在执行第12帧的代码。 再次说下 Tick方法 他是每一个参与游戏的物体都会有的一个函数,游戏循环的时候 每一个参与游戏互动的对象都会执行他。所以 看一个类的时候 去看Tick就行了。 你可以把它当成是一个接口函数,只是代码量太少我没写。 for each (i in allObjList) i.Tick() //鼠标按下 调用 炮台的attack方法 //attck方法会返回一个子弹对象 或者是一个假 这里主要是吧生成的子弹存数组 if (GlobalInput.mouseDown){ j = self_char.attack() if (j){ //武器未冷却的时候 会返回一个假 allObjList.push(j) bullet_list.push(j) } } //碰撞检测 让所有的子弹i 和 所有的敌人j 进行碰撞检测 //如果返回 true 就执行 对敌人的伤害 for each(i in bullet_list) for each (j in enemy_list) if (i.drawObject.hitTestObject(j)) j.applyDamage(300) gotoAndPlay(11)----------------------------------类-------------------------------------- 好了 开始说类。 重要的事情说3次 注意Tick函数 炮台类 move 函数的if 条件 主要是一些边界检测。没写完 就用true代替 移动的逻辑 drawObject.x = 速度 * 方向 这一行很重要 相关的数学算法 让炮台会跟着鼠标转 drawObject.rotation = Math.atan2(vector[1],vector[0]) * 180/Math.PI -90 首先 可以获得的是 鼠标坐标 和 炮台坐标,获得一个向量vector。指向鼠标的向量。 用 Math.atan()函数 获得他的 弧度。 弧度* 180/Math.PI 转化为角度 至于那个-90 emmm 我也不清楚。可能是坐标轴的原因吧。gui程序的坐标轴是 这样子的。 我-90度 他就对了。 O→ X ↓ Y attack函数 打炮low,new子弹。 这里 又用到了 前面说的那个向量了。 【鼠标坐标-炮塔坐标】 这个向量决定了 子弹的飞行方向,当然 new 子弹的时候一定要传参给他。 当然 这里 有个攻击间隔时间。 攻击一次 攻击timer 变为4。Tick 函数 攻击timer-1 只有小于0的时候才攻击 package { import Math public class Mycharacter { public var speed:int = 10 //速度 public var drawObject; //影片剪辑 就是那个炮台长什么样子 var attackTime = 10 //攻击计时器 var attack_interval = 4 //攻击的间隔时间 var stage public function Mycharacter(_stage,actor) { this.stage = _stage drawObject = actor drawObject.y = 200 drawObject.x = 200 // constructor code } public function attack(){ if (attackTime if ( true && GlobalInput.Right>0) drawObject.x += speed * GlobalInput.Right if ( drawObject.x > 0 && GlobalInput.Right0) drawObject.y += speed * GlobalInput.Forward if ( drawObject.y > 0 && GlobalInput.Forward public class Enamy extends EnemyImage { public var _stage public var healthy = 100 public var is_live = true public function Enamy(_stage,x,y) { // constructor code this._stage = _stage this.x = x this.y = y } public function move() { if (healthy>0) _stage.addChild(this) else if (this.is_live) { this.x = -1000 this.y = -1000 } } public function Tick(){ move() } public function applyDamage(num) { this.healthy -= num } } }子弹类 构造函数在做这件事 速度 = 速率* 单位化的方向向量 顺便获取 发射者的位置 package { import Math public class bullet { public var speed = 10 public var vector:Array = [0,0] public var drawObject; var stage public function bullet(_stage,launcher,image,v) { stage = _stage vector[0] = v[0] / Math.sqrt(v[0]*v[0]+v[1]*v[1]) vector[1] = v[1] / Math.sqrt(v[0]*v[0]+v[1]*v[1]) drawObject = image drawObject.x = launcher.drawObject.x drawObject.y = launcher.drawObject.y //drawObject.x = launcher.drawObject.x + launcher.drawObject.width/2 //drawObject.y = launcher.drawObject.y + launcher.drawObject.height/2 // constructor code } public function setSpeed(sp) { speed = sp } public function move(){ drawObject.x -= vector[0] *speed drawObject.y -= vector[1] *speed stage.addChild(drawObject) } public function Tick(){ move() } } }游戏的话 自机 是需要和 敌人和子弹做碰撞检测的。 希望对大家有帮助。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |